const exec = require("child_process").exec;
const path = require("path");
const fs = require("fs");

/**
 * 将视频格式转换成ts格式
 * @param {string} input 需要转换视频的路径
 * @returns {Promise<string>} 返回转换后的ts视频文件路径
 */
function videoToTs(input) {
  return new Promise((resolve, reject) => {
    const outputDir = path.dirname(input);
    const outputFileName = path.basename(input).split(".")[0] + ".ts";
    const outputFilePath = path.join(outputDir, outputFileName);
    console.log("outputFilePath", outputFilePath);
    // 定义转换视频的命令
    const command = `ffmpeg -y -i ${input} -vcodec copy -acodec copy -vbsf h264_mp4toannexb ${outputFilePath}`;
    exec(command, (err, res) => {
      if (err) {
        reject(err);
      } else {
        resolve(outputFilePath); // 返回转换后的ts视频文件路径
      }
    });
  });
}

/**
 * 视频切片方法
 * @param {string} inputPath 输入视频文件路径
 * @param {string} outputPath 切片和索引文件存放的目录路径
 * @returns {Promise<string>} 返回生成的索引文件路径
 */
async function sliceVideoFromFFmpeg(inputPath, outputPath) {
  try {
    // 转换成ts格式的视频文件路径
    const changeTsVideoPath = await videoToTs(inputPath); // 使用await等待videoToTs方法完成，并获取返回值
    console.log("changeTsVideoPath", changeTsVideoPath);
    // 创建切片和索引文件存放的目录
    fs.mkdirSync(outputPath, { recursive: true });
    // 切片命令
    const command = `ffmpeg -i ${changeTsVideoPath} -c copy -map 0 -f segment -segment_list ${path.join(
      outputPath,
      "index.m3u8"
    )} -segment_time 10 ${path.join(outputPath, "test-%04d.ts")}`;
    return new Promise((resolve, reject) => {
      exec(command, (err, res) => {
        if (err) {
          console.error(err);
          reject(err);
        } else {
          console.log("视频切片完成");
          resolve(true);
        }
      });
    });
  } catch (error) {
    console.error(error);
    throw error;
  }
}

/**
 * 获取视频时长（单位：秒）
 * @param {string} url 视频文件路径
 * @returns {Promise<number>} 返回视频时长（单位：秒）
 */
function getVideoDuration(url) {
  return new Promise((resolve, reject) => {
    var cp = exec(
      "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 " +
        url,
      function (err, stdout, stderr) {
        if (err) {
          reject(err);
        } else {
          const duration = parseFloat(stdout.trim());
          resolve(duration);
        }
      }
    );
  });
}

module.exports = {
  videoToTs,
  sliceVideoFromFFmpeg,
  getVideoDuration,
};
